package interfaccia;

import java.util.Vector;


import javax.swing.JOptionPane;

import fsmCore.ClasseEquivalenza;

import fsmCore.Stato;
import fsmCore.Transizione;
import fsmCore.TransizioneAsincrona;
import fsmCore.TransizioneSincrona;
public class Input {
//fai tutti i controlli sulle immissioni, aggiorna i vettori con quello che viene inserito 
public static final String MESSAGGIO_INPUT_STATO="inserisci il nome del nuovo stato";
public static final String MESSAGGIO_STATO_FINALE="Seleziona se e'uno stato finale";
private static final String[] MSG_INPUT_TRANS={"Seleziona lo stato sorgente","Seleziona lo stato destinazione","Seleziona la classe di equivalenza","Inserisci la durata della transizione","Il valore inserito non e' valido!\nInserici la durata della Transizione","Seleziona il tipo della transizione","Inserisci il nome della transizione"};
private static final String[] MSG_INPUT_CLASS_EQ={"Inserisci il nome della classe di equivalenza","Inserisci la durata delle transizioni di questa classe","Il valore inserito non e' valido!\nInserisci la durata delle transizioni di questa classe"};
	
/*
 * se si seleziona annulla o si chiude ritorna null
 * */ 
	public static Stato selezionaStato(String msg,Vector <Stato> listaStati){
		
		Stato[] valori = new Stato[listaStati.size()]; 
		
		
		for(int i=0; i<listaStati.size();i++)
			valori[i]=listaStati.get(i);
		
		return (Stato) JOptionPane.showInputDialog(null, msg, "Selezione dello stato", JOptionPane.QUESTION_MESSAGE,null, valori, valori[0]);
		
		
	}

	/*
	 * se si seleziona annulla o si chiude ritorna null
	 * */ 
	public static ClasseEquivalenza selezionaClasseEq(String msg,Vector <ClasseEquivalenza> listaClassi){
		ClasseEquivalenza[] valori = new ClasseEquivalenza[listaClassi.size()]; 
		
		
		for(int i=0; i<listaClassi.size();i++)
			valori[i]=listaClassi.get(i);
		
		return (ClasseEquivalenza) JOptionPane.showInputDialog(null, msg, "Selezione della classe di equivalenza", JOptionPane.QUESTION_MESSAGE,null, valori, valori[0]);
		
	}
	

	/*
	 * se si seleziona annulla o si chiude ritorna null
	 * */ 
	public static Transizione  selezionaTransizione(String msg,Vector<Transizione> listaTrans){
		Transizione[] valori = new Transizione[listaTrans.size()]; 
		
		
		for(int i=0; i<listaTrans.size();i++)
			valori[i]=listaTrans.get(i);
		
		return (Transizione) JOptionPane.showInputDialog(null, msg, "Selezione della transizione", JOptionPane.QUESTION_MESSAGE,null, valori, valori[0]);
		
	}
	
	/*
	 * se l'utente annulla una qualsiasi selezione o preme x ritorna null
	 */
	public static Stato inputStato(String msg){
		String nome;
		boolean finale;
		nome = JOptionPane.showInputDialog (null, msg);
		if (nome==null)
			return null;
		
		Object[] options = {"non finale", "finale"}; 
		if(JOptionPane.showOptionDialog (null, MESSAGGIO_STATO_FINALE, "Tipo Stato", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0])==1)
			finale=true;
		else
			finale=false;
		
		Stato s= new Stato(nome, finale);
		return s;
	}
	
	/*
	 * se l'utente annulla una qualsiasi selezione o preme x ritorna null
	 */
	private static TransizioneSincrona inputTransizioneSincrona(Vector<Stato>listaStati,Vector<ClasseEquivalenza>listaClassi){
		String nome;
		
		nome = JOptionPane.showInputDialog (null, MSG_INPUT_TRANS[6]);
		if (nome==null)
			return null;
		
		Stato sorgente = Input.selezionaStato(MSG_INPUT_TRANS[0],listaStati);
		if(sorgente==null)
			return null;
		
		Stato destinazione= Input.selezionaStato(MSG_INPUT_TRANS[1], listaStati);
		if(destinazione==null)
			return null;
		
		ClasseEquivalenza classeEq = Input.selezionaClasseEq(MSG_INPUT_TRANS[2], listaClassi);
		if(classeEq==null)
			return null;
		
		return new TransizioneSincrona(sorgente, destinazione,nome, classeEq);
	
		
	}
	
	/*
	 * se l'utente annulla una qualsiasi selezione o preme x ritorna null
	 */
	private static TransizioneAsincrona inputTransizioneAsincrona(Vector<Stato>listaStati){
		String nome = JOptionPane.showInputDialog (null, MSG_INPUT_TRANS[6]);
		if (nome==null)
			return null;
		
		Stato sorgente = Input.selezionaStato(MSG_INPUT_TRANS[0],listaStati);
		if(sorgente==null)
			return null;
		
		Stato destinazione= Input.selezionaStato(MSG_INPUT_TRANS[1], listaStati);
		if(destinazione==null)
			return null;
		
		String s= JOptionPane.showInputDialog(MSG_INPUT_TRANS[3]);
		int durata=0;
		boolean finito;
		do{
			finito=true;
			try{
				durata =Integer.parseInt(s);
				
			
			}catch(NumberFormatException e){
				s=JOptionPane.showInputDialog(MSG_INPUT_TRANS[4]);
				finito=false;
			
			}
			if(durata<0){
				finito=false;
				s=JOptionPane.showInputDialog(MSG_INPUT_TRANS[4]);
			}
		}while(!finito);
		
		return new TransizioneAsincrona(sorgente, destinazione,nome, durata);
	
	}
	
	/*
	 * precondizioni listastato e listaClassi non deve essere null
	 */
	public static Transizione InputTransizione(Vector<Stato>listaStati,Vector<ClasseEquivalenza>listaClassi){
		String options []={"Transizione Sincrona","Transizione Asincrona"};
		int selezione =JOptionPane.showOptionDialog (null, MSG_INPUT_TRANS[5], "Tipo Transizione", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]);
		if(selezione==-1)
			return null;
		else if(selezione==1)
			return Input.inputTransizioneAsincrona(listaStati);
		else
			return Input.inputTransizioneSincrona(listaStati, listaClassi);
	}
	
	/*
	 * se l'utente annulla una scelta ritorna null
	 */
	public static ClasseEquivalenza inputClasseEq(){
		String nome = JOptionPane.showInputDialog (null, MSG_INPUT_CLASS_EQ[0]);
		if (nome==null)
			return null;
		
		
		String s= JOptionPane.showInputDialog(MSG_INPUT_CLASS_EQ[1]);
		int durata=0;
		boolean finito;
		do{
			finito=true;
				
			try{
				durata =Integer.parseInt(s);
			
			}catch(NumberFormatException e){
				s=JOptionPane.showInputDialog(MSG_INPUT_CLASS_EQ[2]);
				finito=false;
			
			}
			if(durata<0){
				finito=false;
				s=JOptionPane.showInputDialog(MSG_INPUT_CLASS_EQ[2]);
			}
			
		}while(!finito);
	
		return new ClasseEquivalenza(nome, durata);
	}
	
}